// 给定一个循环数组（最后一个元素的下一个元素是数组的第一个元素），输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序，这个数字之后的第一个比它更大的数，
// 这意味着你应该循环地搜索它的下一个更大的数。如果不存在，则输出 -1。

// 思路：单调栈，思路和上题类似，单调递减栈，循环数组意味着遍历长度要乘以2，然后统计数组每个元素的下一个更大元素
// 时间复杂度：O(n)，n是nums的长度
// 空间复杂度：O(n)，stack的大小

function nextGreaterElements(nums) {
    let res = new Array(nums.length).fill(-1)
    let stack = [0]
    for (let i = 0; i < 2 * nums.length; i++) {
        while (stack.length && nums[stack[stack.length - 1]] < nums[i % nums.length]) {
            let index = stack.pop()
            res[index] = nums[i % nums.length]
        }
        stack.push(i % nums.length)
    }
    return res
}

nums = [1,2,3,4,3]
console.log(nextGreaterElements(nums))